home *** CD-ROM | disk | FTP | other *** search
/ No Fragments Archive 12: Textmags & Docs / nf_archive_12.iso / MAGS / SOURCES / ATARI_SRC.ZIP / atari source / AHDI / SYQUEST / SQHDX / ZERO.C < prev    next >
Encoding:
C/C++ Source or Header  |  2001-02-09  |  2.8 KB  |  121 lines

  1. /* zero.c */
  2.  
  3. /* 16-Mar-88  ml.    split up assist.c into this and markbad.c    */
  4. /* 11-Dec-87  ml.    added BSL concept to zero().            */
  5.  
  6.  
  7. #include "osbind.h"
  8. #include "obdefs.h"
  9. #include "defs.h"
  10. #include "part.h"
  11. #include "bsl.h"
  12. #include "addr.h"
  13.  
  14.  
  15. extern long gbslsiz();
  16. extern long bslsiz;
  17. extern BYTE *bsl;
  18.  
  19.  
  20. /*           
  21.  * Zero logical dev
  22.  *
  23.  */
  24. zero(ldev)
  25. int ldev;
  26. {
  27.     UWORD pdev,ndirs, fatsiz, w;
  28.     SECTOR fat0, data, dummy=0;
  29.     char bs[512];
  30.     char newbs[512];
  31.     BOOT *boot;
  32.     int  bootsiz, i, ret;
  33.     
  34.     if ((ret = rdsects(ldev, 1, bs, (SECTOR)0)) != 0) {
  35.         if (tsterr(ret) != OK)
  36.         err(bootread);
  37.     return ERROR;
  38.     }
  39.  
  40.     /*
  41.      * Zero file system's boot sector, FAT and DIR sectors.
  42.      */
  43.     boot = (BOOT *)bs;
  44.     gw((UWORD *)&boot->b_ndirs[0], &ndirs);
  45.     gw((UWORD *)&boot->b_spf[0], &fatsiz);
  46.     
  47.     if ((ret = zerosect(ldev, (SECTOR)0, 1 + fatsiz*2 + ndirs/16)) != 0) {
  48.         if (tsterr(ret) != OK)
  49.             err(hdrwrite);
  50.         return ERROR;
  51.     }
  52.          
  53.     /* Put boot information into new boot sector */
  54.     if ((ret = rdsects(ldev, 1, newbs, (SECTOR)0)) != 0) {
  55.         if (tsterr(ret) != OK)
  56.             err(bootread);
  57.         return ERROR;
  58.     }
  59.  
  60.     bootsiz = sizeof(BOOT);        
  61.     for (i = 0; i < bootsiz; i++)
  62.         newbs[i] = bs[i];
  63.     
  64.     /* Write boot information back to disk */
  65.     if ((ret = wrsects(ldev, 1, newbs, (SECTOR)0)) != 0) {
  66.         if (tsterr(ret) != OK)
  67.             err(bootwrit);
  68.         return ERROR;
  69.     }
  70.         
  71.     /*
  72.      * Make first 2 entries in FATs more IBM-like.
  73.      */
  74.     if ((ret = rdsects(ldev, 1, newbs, (SECTOR)1)) != 0) {  /* read FAT 0 */
  75.         if (tsterr(ret) != OK)
  76.         err(fatread);
  77.     return ERROR;
  78.     }
  79.     *(UWORD *)&newbs[0] = 0xf8ff;
  80.     *(UWORD *)&newbs[2] = 0xffff;
  81.     
  82.     /* write FAT 0 and FAT 1 */
  83.     if ((ret = wrsects(ldev, 1, newbs, (SECTOR)1)) != 0
  84.     || (ret = wrsects(ldev, 1, newbs, (SECTOR)(1+fatsiz))) != 0) {
  85.     if (tsterr(ret) != OK)
  86.         err(fatwrite);
  87.     return ERROR;
  88.     }
  89.         
  90.     pdev = ldev;
  91.     log2phys(&pdev, &dummy);
  92.     
  93.     /* Get size of BSL */
  94.     if ((bslsiz = gbslsiz(pdev)) > 0L) {
  95.         /* Allocate memory for existing BSL */
  96.         if ((bsl = (BYTE *)mymalloc((int)bslsiz << 9)) <= 0)
  97.             return err(nomemory);
  98.             
  99.         /* Read in BSL */
  100.         if ((dummy = rdbsl(pdev)) != OK) {
  101.             free(bsl);
  102.             if (dummy = INVALID)
  103.                 err(cruptbsl);
  104.             return ERROR;
  105.         }
  106.         
  107.       gw((UWORD *)&boot->b_res[0], &w);
  108.     fat0 = (SECTOR)w;
  109.     data = (SECTOR)1 + (SECTOR)fatsiz*2 + (((SECTOR)ndirs*32)/512);
  110.     
  111.         /* Mark Vendor or User Bad Sectors into FAT */
  112.     if (bsl2fat(ldev, fat0, fatsiz, data, MEDIA) != OK) {
  113.             free(bsl);
  114.             return ERROR;
  115.         }
  116.     free(bsl);
  117.     }
  118.     return OK;
  119. }
  120.  
  121.